Technical Q&A QA1315
Why isn't my edit text box in my Navigation dialog's custom area working on 10.3?


Q: ナビゲーションダイアログのカスタム領域にある Edit Text ボックスが 10.3 で動作しないのはなぜでしょうか。

A: Navigation Services ダイアログは、Mac OS X 10.3 になって複合化されました。NavCustomControl / kNavCtlAddControl 呼び出しで、ダイアログのコントロールリスト内にコントロールまたは HIVIew を追加(また移動)できるようになりました。これまでは、コントロールがコントロールリスト内にあらかじめ入っている必要がありました。

バグ(修正予定)により、この NavCustomControl 呼び出しが、Edit Text コントロールがコントロールリスト内にすでにあった場合に、コントロールの処理を誤ります。その結果として生じる現象は、作成時に文字列を指定しても空のボックスが表示され、そのエディットボックスにフォーカスが設定されても文字の入力を受け付けないというものです。このバグには簡単な回避策があります。以下に示します。

以前に正しく動作していた次のようなコードがあったとします。



リスト 1. 以前のコード。

CreateEditUnicodeTextControl(callBackParms->window, &bounds,
CFSTR("Some Text"), false, NULL, &editText);
NavCustomControl(callBackParms->context, kNavCtlAddControl, editText);



Mac OS X 10.3 では、これを次のように変更する必要があります。



リスト 2. 新しいコード。

CreateEditUnicodeTextControl(NULL, &bounds,
CFSTR("Some Text"), false, NULL, &editText);
NavCustomControl(callBackParms->context, kNavCtlAddControl, editText);



次のように、バージョン検査を追加することもできます。



リスト 3. HIToolbox のバージョンの確認。

WindowRef inWindow;
if (GetHIToolboxVersion() < 0x130)
inWindow = callBackParms->window;
else
inWindow = NULL;
CreateEditUnicodeTextControl(inWindow, &bounds,
CFSTR("Some Text"), false, NULL, &editText);



HIToolbox のバージョンを取得するには、次のコードを使用できます。



リスト 4. HIToolbox のバージョンの取得。

UInt32 GetHIToolboxVersion()
   {
CFBundleRef bundle;
CFStringRef versStr = NULL;
static UInt32 version = 0;

// 次の負荷の高いコードは一度だけ実行する ...
if (version != 0) return version;

bundle = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.HIToolbox"));
if ( bundle != NULL )
versStr = (CFStringRef)CFBundleGetValueForInfoDictionaryKey(bundle,
CFSTR("CFBundleShortVersionString"));
if (  versStr != NULL &&

CFGetTypeID(versStr) == CFStringGetTypeID())
         {
int major = 0, minor = 0, bugfix = 0;
char sz[20];

CFStringGetCString(versStr, sz, sizeof(sz), kCFStringEncodingUTF8);
sscanf(sz, "%d.%d.%d", &major, &minor, &bugfix);
version = ( major << 8 ) + ( minor << 4 ) + bugfix;
         }

return version;
   }



バグが修正され、CreateEditUnicodeTextControl 呼び出しの第 1 引数として callBackParms->window が使用できるようになった場合でも、第 1 引数として NULL を渡す回避策は、Mac OS X 10.3 以降で期待どおりに動作します。


[2003 年 10 月 28 日]